"""
文档批量替换工具
支持在多个文档中批量查找和替换内容
"""
from docx import Document
import os
import re


class DocReplacer:
    """文档批量替换类"""
    
    def __init__(self):
        """初始化替换器"""
        self.replace_count = 0
        self.processed_files = []
    
    def replace_in_docx(self, file_path, find_text, replace_text, 
                       use_regex=False, case_sensitive=True):
        """
        在Word文档中查找并替换文本
        
        Args:
            file_path: 文档路径
            find_text: 查找的文本
            replace_text: 替换的文本
            use_regex: 是否使用正则表达式
            case_sensitive: 是否区分大小写
        
        Returns:
            int: 替换的数量
        """
        try:
            doc = Document(file_path)
            count = 0
            
            # 在段落中替换
            for paragraph in doc.paragraphs:
                count += self._replace_in_paragraph(
                    paragraph, find_text, replace_text, use_regex, case_sensitive
                )
            
            # 在表格中替换
            for table in doc.tables:
                for row in table.rows:
                    for cell in row.cells:
                        for paragraph in cell.paragraphs:
                            count += self._replace_in_paragraph(
                                paragraph, find_text, replace_text, use_regex, case_sensitive
                            )
            
            # 在页眉和页脚中替换
            for section in doc.sections:
                # 处理页眉
                header = section.header
                for paragraph in header.paragraphs:
                    count += self._replace_in_paragraph(
                        paragraph, find_text, replace_text, use_regex, case_sensitive
                    )
                # 处理页眉中的表格
                for table in header.tables:
                    for row in table.rows:
                        for cell in row.cells:
                            for paragraph in cell.paragraphs:
                                count += self._replace_in_paragraph(
                                    paragraph, find_text, replace_text, use_regex, case_sensitive
                                )
                
                # 处理页脚
                footer = section.footer
                for paragraph in footer.paragraphs:
                    count += self._replace_in_paragraph(
                        paragraph, find_text, replace_text, use_regex, case_sensitive
                    )
                # 处理页脚中的表格
                for table in footer.tables:
                    for row in table.rows:
                        for cell in row.cells:
                            for paragraph in cell.paragraphs:
                                count += self._replace_in_paragraph(
                                    paragraph, find_text, replace_text, use_regex, case_sensitive
                                )
            
            # 保存文档
            doc.save(file_path)
            return count
        except Exception as e:
            raise Exception(f"Word文档替换失败: {str(e)}")
    
    def _replace_in_paragraph(self, paragraph, find_text, replace_text, 
                             use_regex=False, case_sensitive=True):
        """
        在段落中进行替换
        
        Args:
            paragraph: 段落对象
            find_text: 查找的文本
            replace_text: 替换的文本
            use_regex: 是否使用正则表达式
            case_sensitive: 是否区分大小写
        
        Returns:
            int: 替换的数量
        """
        original_text = paragraph.text
        count = 0
        
        if use_regex:
            # 使用正则表达式替换
            flags = 0 if case_sensitive else re.IGNORECASE
            new_text, count = re.subn(find_text, replace_text, original_text, flags=flags)
        else:
            # 普通文本替换
            if case_sensitive:
                # 区分大小写
                count = original_text.count(find_text)
                new_text = original_text.replace(find_text, replace_text)
            else:
                # 不区分大小写的替换
                count, new_text = self._case_insensitive_replace(
                    original_text, find_text, replace_text
                )
        
        # 只有发生替换时才更新段落文本
        if count > 0:
            # 保留段落格式，只更新文本内容
            # 清除现有runs
            for run in paragraph.runs:
                run.text = ''
            
            # 添加新文本（使用第一个run的格式，如果存在）
            if paragraph.runs:
                paragraph.runs[0].text = new_text
            else:
                paragraph.add_run(new_text)
        
        return count
    
    def _case_insensitive_replace(self, text, find_text, replace_text):
        """
        不区分大小写的文本替换
        
        Args:
            text: 原文本
            find_text: 查找的文本
            replace_text: 替换的文本
        
        Returns:
            tuple: (替换次数, 新文本)
        """
        # 使用正则表达式进行不区分大小写的替换
        pattern = re.escape(find_text)
        new_text, count = re.subn(pattern, replace_text, text, flags=re.IGNORECASE)
        return count, new_text
    
    def replace_in_txt(self, file_path, find_text, replace_text, 
                      use_regex=False, case_sensitive=True, encoding='utf-8'):
        """
        在文本文件中查找并替换
        
        Args:
            file_path: 文件路径
            find_text: 查找的文本
            replace_text: 替换的文本
            use_regex: 是否使用正则表达式
            case_sensitive: 是否区分大小写
            encoding: 文件编码
        
        Returns:
            int: 替换的数量
        """
        try:
            # 尝试多种编码读取文件
            content = None
            encodings = [encoding, 'utf-8', 'gbk', 'gb2312', 'utf-8-sig']
            used_encoding = encoding
            
            for enc in encodings:
                try:
                    with open(file_path, 'r', encoding=enc) as f:
                        content = f.read()
                    used_encoding = enc
                    break
                except (UnicodeDecodeError, LookupError):
                    continue
            
            if content is None:
                raise Exception("无法读取文件，请检查文件编码")
            
            # 执行替换
            if use_regex:
                # 使用正则表达式替换
                flags = 0 if case_sensitive else re.IGNORECASE
                new_content, count = re.subn(find_text, replace_text, content, flags=flags)
            else:
                # 普通文本替换
                if case_sensitive:
                    count = content.count(find_text)
                    new_content = content.replace(find_text, replace_text)
                else:
                    # 不区分大小写的替换
                    count, new_content = self._case_insensitive_replace(
                        content, find_text, replace_text
                    )
            
            # 写回文件
            with open(file_path, 'w', encoding=used_encoding) as f:
                f.write(new_content)
            
            return count
        except Exception as e:
            raise Exception(f"文本文件替换失败: {str(e)}")
    
    def batch_replace(self, directory, find_text, replace_text, 
                     file_pattern='*.docx', use_regex=False):
        """
        批量替换目录中的文件
        
        Args:
            directory: 目录路径
            find_text: 查找的文本
            replace_text: 替换的文本
            file_pattern: 文件匹配模式
            use_regex: 是否使用正则表达式
        
        Returns:
            dict: 处理结果统计
        """
        # TODO: 实现批量替换逻辑
        results = {
            'total_files': 0,
            'processed_files': 0,
            'total_replacements': 0,
            'failed_files': []
        }
        
        return results